package com.kangkang.reflection.objectEx;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 描述:
 * 日期: 2022-03-18 <br>
 *
 * @author: 旺旺老师<br>
 * @version: 1.0<br>
 */
public class FieldAndMethod {
    public static void methodDemo() {
        Class cls = EmployeeDAO.class;
        try {
            Object o = cls.getConstructor().newInstance();
            Object returnType = null;

            //一 调用无参数无返回值类型
            System.out.println("---------------------------------------");
            System.out.println("调用无参数无返回值类型");
            //参数: 1 方法名 2 方法参数类型封装的Class
            Method m1 = cls.getDeclaredMethod("method1");
            //动态调用方法
            //public 调用方法后的返回值 invoke(对象名,方法参数)
            //public Object invoke(Object obj, Object... args)
            returnType = m1.invoke(o);
            System.out.println(returnType);

            //二 调用无参数有返回值类型
            System.out.println("---------------------------------------");
            System.out.println("调用无参数有返回值类型");
            //参数: 1 方法名 2 方法参数类型封装的Class
            Method m2 = cls.getDeclaredMethod("method2");
            //动态调用方法
            //public 调用方法后的返回值 invoke(对象名,方法参数)
            returnType = m2.invoke(o);
            System.out.println("returnType : " + returnType);

            //三 有参数有返回值类型
            System.out.println("---------------------------------------");
            System.out.println("有参数有返回值类型");
            //参数: 1 方法名 2 方法参数类型封装的Class
            //Servlet  doGet(request, response)
            //Struts2 execute()
            Method m3 = cls.getDeclaredMethod("method3", int.class, String.class);
            //动态调用方法
            //public 调用方法后的返回值 invoke(对象名,方法参数)
            returnType = m3.invoke(o, 3, "nihao");
            System.out.println("returnType : " + returnType);

            //四 有自定义类型参数与返回值
            System.out.println("---------------------------------------");
            System.out.println("有自定义类型参数与返回值");
            //参数: 1 方法名 2 方法参数类型封装的Class
            //Servlet  doGet(request, response)
            //Struts2 execute()
            Method m4 = cls.getDeclaredMethod("method4", Employee.class);
            //动态调用方法
            //public 调用方法后的返回值 invoke(对象名,方法参数)
            Employee e = new Employee();
            returnType = m4.invoke(o, e);
            System.out.println("returnType : " + returnType.getClass());


        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }
    public static void fieldDemo() {
        Class cls = Employee.class;
        try {
            //调用无参构造函数创建对象
            Object o = cls.getConstructor().newInstance();
            System.out.println(o);

            //给对象的私有属性赋值
            //1 得到 Field set方法调用
            Field f = cls.getDeclaredField("tel");
            //运行访问私有属性
            f.setAccessible(true);
            f.set(o, "18192066168");

            Field f2 = cls.getDeclaredField("address");
            //运行访问私有属性
            f2.setAccessible(true);
            f2.set(o, "西安");
            System.out.println(o);

            //2  通过私有属性的访问器调用,调用方法
            Method m = cls.getDeclaredMethod("setTel", String.class);
            m.invoke(o, "88888888888888888");
            System.out.println(o);



        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException | NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        fieldDemo();
        //methodDemo();
    }
}
